# 获取以context开头 .yaml结尾的内容，并放入到公共参数中去!
# 用例编号_XXXXXX. yaml 则认为是对应的测试用例

import os, yaml, uuid, copy
# TODO 1: 导入对应的包，结合你自己的项目路径改动
from core.globalContext import g_context

import yaml


# TODO : Dome - 读取Yaml的数据 ：[{用例1}]
def readYaml(file_path):
    load_context_from_yaml(r"/day09\apirun_frame\examples")
    case_infos = []
    with open(file_path, "r", encoding='utf-8') as rfile:
        caseinfo = yaml.full_load(rfile)
        case_infos.append(caseinfo)
        return case_infos


# TODO 2: 写入content.yaml到全局变量的数据当中
def load_context_from_yaml(folder_path):
    try:
        yaml_file_path = os.path.join(folder_path, 'context.yaml')
        with open(yaml_file_path, 'r', encoding='utf-8') as file:
            data = yaml.load(file, Loader=yaml.FullLoader)
            print("加载context.yaml内容:", data)
            if data: g_context().set_by_dict(data)
    except Exception as e:
        print(f"装载yaml文件错误: {str(e)}")
        return False


def load_yaml_files(config_path):
    """
    返回满足条件的yaml文件列表
    :param config_path: Yaml存放路径
    :return: yaml_caseInfos
    """
    yaml_caseInfos = []  # 存储所有的数据
    suite_folder = os.path.join(config_path)

    # TODO 1: 存放在该路径的全局变量进行写入
    load_context_from_yaml(suite_folder)

    # TODO 2: 扫描文件夹下的yaml，获取 suite 文件夹下的所有 YAML 文件，并按文件名排序
    file_names = [(int(f.split("_")[0]), f) for f in os.listdir(suite_folder) if
                  f.endswith(".yaml") and f.split("_")[0].isdigit()]
    # TODO 3: 排序之后只保留文件名
    file_names.sort()
    file_names = [f[-1] for f in file_names]

    # TODO 4: 遍历文件名并且加入到yaml_caseInfos文件中
    for file_name in file_names:
        file_path = os.path.join(suite_folder, file_name)
        with open(file_path, "r", encoding='utf-8') as rfile:
            caseinfo = yaml.full_load(rfile)
            yaml_caseInfos.append(caseinfo)
    return yaml_caseInfos


def yaml_case_parser(config_path):
    # TODO 0: 对应固定的格式
    case_infos = []
    case_names = []

    # TODO 1: 获取符合条件的 YAML 文件列表
    yaml_caseInfos = load_yaml_files(config_path)

    # TODO 调试：打印一下全局变量和yaml_caseInfos的数据
    print(yaml_caseInfos)
    print(g_context().show_dict())

    # TODO 2: 遍历yaml的用例列表，然后进行处理成统一的格式
    for caseinfo in yaml_caseInfos:

        # TODO 扩展：读取 DDTS 节点生成多组测试用例
        ddts = caseinfo.get("ddts", [])
        if len(ddts) > 0:
            # 删除是为了分开放到对应的caseinfo中去
            caseinfo.pop("ddts")

        if len(ddts) == 0:
            case_name = caseinfo.get("desc", uuid.uuid4().__str__())  # 用例名称
            caseinfo.update({"_case_name": case_name})  # 把生成的用例名称保存到用例对象中
            case_infos.append(caseinfo)  # 用例信息
            case_names.append(case_name)  # 和用例对应的测试用例名
        else:
            # TODO 扩展：循环生成多个用例执行对象，保存起来。
            for ddt in ddts:
                new_case = copy.deepcopy(caseinfo)
                # TODO 扩展-1: 将数据读取后更新到 context 里面，没有就设置context为空
                context = new_case.get("context", {})
                ddt.update(context)
                new_case.update({"context": ddt})
                # TODO 扩展-2: 设置测试用例标题：用例名称由名称及ddt数据组说明组成
                case_name = f'{caseinfo.get("desc", uuid.uuid4().__str__())}-{ddt.get("desc", uuid.uuid4().__str__())}'  # 用例名称
                new_case.update({"_case_name": case_name})  # 把生成的用例名称保存到用例对象中
                # TODO 扩展-3: 添加到对应的用例当中
                case_infos.append(new_case)  # 用例信息
                case_names.append(case_name)  # 和用例对应的测试用例名

    return {
        "case_infos": case_infos,
        "case_names": case_names
    }
